iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
自我挑戰組

NLP 新手的 30 天入門養成計畫系列 第 23

[Day 23] - 挑戰 Transformer 系列:Self-Attention

  • 分享至 

  • xImage
  •  

今天繼續來挑戰怎麼理解 Transformer 架構吧!

Attention 的概念其實之前就有了,不過在 2017 年發表的論文《Attention Is All You Need》中,介紹了自注意力機制如何應用在 Transformer 的模型,並在翻譯等任務上有了出色的表現,那什麼是自注意力機制呢?

還記得之前提過的 Word2Vec 嗎?我們談到,它存在的一個缺陷是只為每個單詞生成了一個固定的向量表示,如果在不同情境之下這個單詞有了不同的含意,它還是只能用同一個向量,這會導致模型對整篇文章的理解產生一點偏差。

而 Attention 很厲害的地方在於,它會在轉換成向量的時候把周邊單詞的因素也考量進來,如此一來,即便是同樣的單詞在不同情境下也會有不一樣的向量表示,就能夠更精確的理解語意。

我們可以從這張圖來去理解自注意力機制在做的事情:

https://ithelp.ithome.com.tw/upload/images/20240828/20159088jtMta49M0o.png

假設在文字被 embedding 之後,input 的 sequence 中有這四個向量,分別用 a1a2a3a4 表示,首先來看 a1 的部分,我們在之前的神經網路訓練過程中獲得了 WqWkWv 三個權重矩陣,將他們分別乘上 a1,可以獲得 q1k1v1 這三個向量。

根據我的理解,這三個向量代表的含意有點像是:

  • q:這個單詞想知道所有和它有關的訊息,所以它需要詢問所有的單詞
  • k:這個單詞所能提供關於自己的訊息,讓其它單詞可以查詢
  • v:這個單詞本身代表的值,也就是具體的內容

PS : 這個部分如果有人知道比較詳細的話,我也希望可以多了解一下 ~

因此,注意力其實就是根據其它單詞對這個單詞所提供的一些資訊,去決定他們對自己最終輸出的影響程度。

那麼就繼續來計算注意力吧!

接著,我們要去計算在這個 sequence 當中其他單詞對 a1 的重要程度,所以會將 q1 分別與 k1k2k3 內積,最後獲得的分數 α 我們把它叫做 attention score,在繼續下一個步驟之前,會先對 α 做 softmax,獲得 α'

自注意力相較於注意力多做的事情就是,它除了關注其它詞,也希望可以關注對自身不同部分的訊息,也就是 k 的部分。

接下來,將每一個單詞對 a1 的重要程度 α' 乘上各自對應的值 v,計算出來的結果再全部加總,獲得最終的輸出 b1,也就是說,如果前一步計算 attention score 的時候某一個單詞對 a1 的重要程度比較大,最終它就會對 b1 造成較大的影響。

最後,我們對所有的 a 都做一遍同樣的事情,可以獲得 b1b2b3b4 這四個向量,這就是自注意力機制在做的事情。

接著要來解釋為什麼這個流程可以平行運算,我們把所有的 a 合起來變成一個矩陣 I,直接做矩陣運算就會獲得 Q = Wq * IK = Wk * IV = Wv * I,接著要對 QK 內積,一樣是矩陣運算得到 α = Q * (K ^ T),T 是轉置矩陣的意思,對 α 做完 softmax 之後,最後再乘上剛剛算出來的矩陣 V 就可以得到由全部 b 組成的矩陣 O 了。

也就是說,整個計算注意力的過程都只涉及線性變換,也沒有任何的循環流程,因此可以整個 sequence 同時進行。

這就是原始論文中提到計算 attention 的公式,其中 dk 的作用是要抑制因為做內積而導致數值規模太大的問題:

https://ithelp.ithome.com.tw/upload/images/20240828/20159088jnHXxtHV98.png

而論文中提到的多頭自注意力 ( Multi-Head Self Attention ) 機制則是讓模型可以把注意力放在不同字上,而不是原先側重於其中一個字,它的做法是把權重矩陣 WqWkWv 分成多個頭,各自計算完之後再組合起來。

這樣一來,我們就把最重要的部分講完了,回到 Transformer 的架構圖上:

https://ithelp.ithome.com.tw/upload/images/20240828/20159088V2gfUqdtyE.png

前面這些步驟都是屬於線性變換,而當我們把 Multi-Head Attention 計算完之後會進入前饋神經網路 ( Feed Forward Neural Network, FFNN ),也就是深度學習的部分,這一整個區塊會執行 N 次,執行完之後就會輸出 Encoding 的結果。

而在 Decoding 的部分,會做 Masked Multi-Head Attention 的原因在於,我們在輸出前面部分的時候並不知道後面長什麼樣子,自然就沒辦法進行關注,只有在輸出後面部分的時候,才能夠去計算它和前面的注意力。整個 Decoder 也是執行 N 次。

整個 Transformer 的架構大致就是這樣,裡面還有無數的細節可以拿出來討論,這也是我之後要繼續努力的目標。

而也因為這個架構本身支持並行運算,只要硬體跟得上就可以把規模放大,也就是把 N 執行上百次,讓它能夠對自然語言的理解更好,可以處理更長的文本。

現在有很多的大型語言模型 ( Large Language Model ) 就是在這個架構的基礎之上做了一些調整,然後疊超級多層,累積幾百億個參數之後就發現模型好像產生了頓悟現象,各方面的表現都變的超強,這也是 LLM 能夠獲得成功的原因之一。

明天想要聊聊我對大型語言模型的基本認識,以及現階段的我可以怎麼去應用它。

推薦文章

PS : Attention 這張圖是我在看了李宏毅教授的影片後自己試著畫畫看的,花了好幾個小時才全部理解完 ……


上一篇
[Day 22] - 挑戰 Transformer 系列:Seq2Seq
下一篇
[Day 24] - 簡單聊聊什麼是大型語言模型
系列文
NLP 新手的 30 天入門養成計畫30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言